package cc.owoo.godpen.file;

import cc.owoo.godpen.util.N;

import java.io.File;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;

/**
 * 文件夹管理器，适用于目录结构庞大的文件夹管理，对于每个目录都会存放一个list.ini，请勿手动删除硬盘的文件
 * Created by nimensei
 * 2022-03-20 下午 06:43
 **/
public class Folder implements Iterable<String> {
    private final String path;// 目录
    private final String name;// 名称
    private final HashSet<String> list = new HashSet<>();// 文件夹目录

    public Folder(File path) {
        this.path = path.getPath();
        name = path.getName().toUpperCase(Locale.ROOT);
        String[] list = path.list();
        if (list == null)
            return;
        for (String s : list) {
            if (!new File(path + "/" + s).isDirectory())
                continue;
            this.list.add(s.toUpperCase(Locale.ROOT));
        }
    }

    /**
     * 创建一个文件夹
     *
     * @return 文件夹名称
     */
    public File create() {
        int count = 0;
        while (true) {
            if (++count > 100)
                throw new RuntimeException("文件夹创建失败");
            String name = N.soleCode();
            if (!list.add(name))
                continue;
            File file = new File(path + "/" + name);
            if (file.isDirectory() || !file.mkdir())
                continue;
            return file;
        }
    }

    /**
     * 是否存在该文件夹
     *
     * @param name 文件夹名称
     * @return 是否存在
     */
    public boolean contains(String name) {
        return list.contains(name);
    }

    /**
     * 删除文件夹
     *
     * @param name 文件夹名称
     * @return 是否删除成功
     */
    public boolean delete(String name) {
        if (!list.remove(name))
            return false;
        return new File(path + "/" + name).delete();
    }

    /**
     * 获取文件夹名称
     *
     * @return 文件夹名称
     */
    public String getName() {
        return name;
    }

    /**
     * 获取目录
     *
     * @return 目录
     */
    public String getPath() {
        return path;
    }

    /**
     * 文件夹数量
     *
     * @return 文件夹数量
     */
    public int size() {
        return list.size();
    }

    /**
     * 获取目录列表
     *
     * @return 目录列表
     */
    public HashSet<String> list() {
        return list;
    }

    @Override
    public Iterator<String> iterator() {
        return list.iterator();
    }
}
